import { login, logout, getInfo, refreshToken } from "@/api/user";
import {
  getToken,
  setToken,
  setTokenTime,
  getrefreshToken,
  setrefreshToken,
  setrefreshTokenTime,
  removeToken,
  removeTokenTime,
  removerefreshToken,
  removerefreshtokenTime,
} from "@/utils/auth";
import router, { resetRouter } from "@/router";

const state = {
  token: getToken(),
  refreshToken: getrefreshToken(),
  name: "",
  uno: "",
  // introduction: "",
  roles: [],
  tenant: "",
};

const mutations = {
  SET_TOKEN: (state, token) => {
    state.token = token;
  },
  SET_TENANT: (state, tenant) => {
    state.tenant = tenant;
  },
  SET_REFRESH_TOKEN: (state, refreshToken) => {
    state.refreshToken = refreshToken;
  },
  // SET_INTRODUCTION: (state, introduction) => {
  //   state.introduction = introduction;
  // },
  SET_NAME: (state, name) => {
    state.name = name;
  },
  SET_UNO: (state, uno) => {
    state.uno = uno;
  },
  SET_ROLES: (state, roles) => {
    state.roles = roles;
  },
};

const actions = {
  // user login
  login({ commit }, userInfo) {
    const { username, password, tenant } = userInfo;
    return new Promise((resolve, reject) => {
      const params = {
        username: username.trim(),
        password: password,
        tenant: tenant,
      };
      login({ ...params })
        .then((response) => {
          const { data } = response;
          commit("SET_TOKEN", data.accessToken);
          commit("SET_TENANT", tenant);
          commit("SET_REFRESH_TOKEN", data.refreshToken);
          setToken(data.accessToken);
          setTokenTime(data.accessValidity);
          setrefreshToken(data.refreshToken);
          setrefreshTokenTime(data.refreshValidity);
          resolve(response);
        })
        .catch((error) => {
          reject(error);
        });
    });
  },
  // 刷新token
  refreshToken({ commit, state }) {
    return new Promise((resolve, reject) => {
      const params = state.refreshToken;
      refreshToken(params)
        .then((response) => {
          const { data } = response;
          commit("SET_TOKEN", data.accessToken);
          commit("SET_REFRESH_TOKEN", data.refreshToken);
          setToken(data.accessToken);
          setTokenTime(data.accessValidity);
          setrefreshToken(data.refreshToken);
          setrefreshTokenTime(data.refreshValidity);
          resolve(true);
        })
        .catch((error) => {
          console.error("Refresh Token Error:", error); // 记录错误信息
          reject(error); // 返回错误对象，以便调用处处理
        });
    });
  },
  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token)
        .then((response) => {
          const { data } = response;
          console.log("getInfo:", data);
          if (!data) {
            reject("Verification failed, please Login again.");
          }

          const { permissions, uname, uno } = data;

          // roles must be a non-empty array
          if (!permissions || permissions.length <= 0) {
            reject("getInfo: roles must be a non-null array!");
          }
          permissions.push("admin"); // 给管理员角色加上admin权限
          commit("SET_ROLES", permissions);
          commit("SET_NAME", uname);
          commit("SET_UNO", uno);
          resolve(data);
        })
        .catch((error) => {
          reject(error);
        });
    });
  },

  // user logout
  logout({ commit, state, dispatch }) {
    return new Promise((resolve, reject) => {
      logout(state.token)
        .then(() => {
          commit("SET_TOKEN", "");
          commit("SET_TENANT", "");
          commit("SET_REFRESH_TOKEN", "");
          commit("SET_ROLES", []);
          removeToken();
          removeTokenTime();
          removerefreshToken();
          removerefreshtokenTime();
          resetRouter();

          // reset visited views and cached views
          // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
          dispatch("tagsView/delAllViews", null, { root: true });

          resolve();
        })
        .catch((error) => {
          reject(error);
        });
    });
  },

  // remove token
  resetToken({ commit }) {
    return new Promise((resolve) => {
      commit("SET_TOKEN", "");
      commit("SET_REFRESH_TOKEN", "");
      commit("SET_ROLES", []);
      removeToken();
      removeTokenTime();
      removerefreshToken();
      removerefreshtokenTime();
      resolve();
    });
  },

  // dynamically modify permissions
  // async changeRoles({ commit, dispatch }, role) {
  //   const token = role + "-token";

  //   commit("SET_TOKEN", token);
  //   setToken(token);

  //   const { roles } = await dispatch("getInfo");

  //   resetRouter();

  //   // generate accessible routes map based on roles
  //   const accessRoutes = await dispatch("permission/generateRoutes", roles, {
  //     root: true,
  //   });
  //   // dynamically add accessible routes
  //   router.addRoutes(accessRoutes);

  //   // reset visited views and cached views
  //   dispatch("tagsView/delAllViews", null, { root: true });
  // },
};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
};
